
package util.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import util.StringUtil;

/*
SimpleDateFormat
http://developer.android.com/reference/java/text/SimpleDateFormat.html
*/

/**
 *
 * @author Rdelacruz
 * @version 21/01/2015
 */
public class DateUtil {
    
    public static final DateFormat dateFormatFecha = new SimpleDateFormat("dd/MM/yyyy");// "25/12/2014"
    public static final DateFormat dateFormatHora = new SimpleDateFormat("HH:mm");// 23:10
    public static final DateFormat dateFormatDefault = dateFormatFecha;
    public static final DateFormat dateFormatSufijoFechaHora = new SimpleDateFormat("dd-MM-yyyy_HH-mm-ss");// "25/12/2014"
    
    public static final long DIA = 24*60*60*1000;//en milisegundos
    public static final long SEMANA = 7*DIA;//en milisegundos
    
    public static String sumar(String fecha, int dias) throws ParseException {
        if(fecha==null || fecha.isEmpty())
            return "";
        Date f = StringToDate(fecha);
        return DateToString(new Date(f.getTime()+dias*DIA));
    }
    
    public static Date StringToDate(String fecha) throws ParseException {
        return StringToDate(fecha,dateFormatDefault);
    }
    
    public static String DateToString(Date fecha) {   
        return DateToString(fecha,dateFormatDefault);
    }
    
    public static Date StringToDate(String fecha, DateFormat dateFormat) throws ParseException {
        if(fecha==null)
            return null;        
        return dateFormat.parse(fecha);
    }
    
    public static String DateToString(Date fecha, DateFormat dateFormat) {   
        if(fecha==null)
            return null;
        return dateFormat.format(fecha);       
    }
    
    //http://stackoverflow.com/questions/6531632/conversion-from-12-hours-time-to-24-hours-time-in-java
    public static String convertir12HorasTo24Horas(String tiempo12Horas) throws ParseException {
       SimpleDateFormat displayFormat = new SimpleDateFormat("HH:mm");
       SimpleDateFormat parseFormat = new SimpleDateFormat("hh:mm a");
       Date date = parseFormat.parse(tiempo12Horas);  
       //System.out.println(parseFormat.format(date) + " = " + displayFormat.format(date));
       return displayFormat.format(date);
    }
    
    //http://stackoverflow.com/questions/6907968/how-to-convert-24-hr-format-time-in-to-12-hr-format
    public static String convertir24HorasTo12Horas(String tiempo24Horas, boolean mostrarAMPM) throws ParseException {
        String formato = mostrarAMPM ? "h:mm a" : "h:mm";
        final SimpleDateFormat displayFormat = new SimpleDateFormat(formato);
        final SimpleDateFormat parseFormat = new SimpleDateFormat("H:mm");
        final Date date = parseFormat.parse(tiempo24Horas);
        //System.out.println(date);
        //System.out.println(displayFormat.format(date));
        return displayFormat.format(date);
    }
    
    //Autor: Ramon De la Cruz
    public static String convertirVarios24HorasSeparadorPorComasTo12Horas(String tiemposEn24Horas) throws ParseException {
        return convertirVarios24HorasSeparadorPorComasTo12Horas(tiemposEn24Horas, true);
    }
    
    //Autor: Ramon De la Cruz
    public static String convertirVarios24HorasSeparadorPorComasTo12Horas(String tiemposEn24Horas, boolean mostrarAMPM) throws ParseException {
        String tiempos24[] = StringUtil.splitPorComasEspaciosToArray(tiemposEn24Horas);
        StringBuilder sb = new StringBuilder();
        for(String t24 : tiempos24) {
            sb.append(convertir24HorasTo12Horas(t24+":00",mostrarAMPM));
            sb.append(", ");
        }        
        sb.deleteCharAt(sb.length()-1);//borrando la coma        
        sb.deleteCharAt(sb.length()-1);//borrando el espacio
        return sb.toString();
    }
    
    public static String getFechaActualString(DateFormat dateFormat) {
    	//Con Calendar
    	Calendar cal = Calendar.getInstance();        
    	//System.out.println(dateFormat.format(cal.getTime()));
    	return dateFormat.format(cal.getTime());
    }
    
  
    public static String getFechaActualString(String patronFecha) {        
        DateFormat dateFormat = new SimpleDateFormat(patronFecha);
        return getFechaActualString(dateFormat);
    }
    
    public static String getFechaActualString() {
        return getFechaActualString("yyyy/MM/dd HH:mm:ss");
    }
    
    public static String getFechaActualString2() {
        //Con Date
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        //System.out.println(dateFormat.format(date));
        return dateFormat.format(date);
    }
    
    public static Date sumar(Date fecha, long milisegundos) {
        return new Date(fecha.getTime()+milisegundos);
    }    
    
    
    
    public static int[] split(String fecha) {        
        String[] datos = fecha.split("/");        
        int[] datosInt = new int[3];
        datosInt[0] = Integer.parseInt(datos[0]);
        datosInt[1] = Integer.parseInt(datos[1]);
        datosInt[2] = Integer.parseInt(datos[2]);
        return datosInt;
    }
    
    //http://www.forosdelweb.com/f45/calcular-edad-apartir-fecha-nacimiento-692695/    
    //Otro método: http://www.informaticosmurcia.es/calcular-edad-de-una-persona-en-java/
    public static Integer getEdad(String fecha_nac) {     //fecha_nac debe tener el formato dd/MM/yyyy   
        if(fecha_nac==null)
            return null;
        Date fechaActual = new Date();
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        String hoy = formato.format(fechaActual);
        String[] dat1 = fecha_nac.split("/");
        String[] dat2 = hoy.split("/");
        int anos = Integer.parseInt(dat2[2]) - Integer.parseInt(dat1[2]);
        int mes = Integer.parseInt(dat2[1]) - Integer.parseInt(dat1[1]);
        if (mes < 0) {
          anos = anos - 1;
        } else if (mes == 0) {
          int dia = Integer.parseInt(dat2[0]) - Integer.parseInt(dat1[0]);
          if (dia > 0) {
            anos = anos - 1;
          }
        }
        return anos;
    }
    
    //http://carloszuluaga.wikidot.com/articulos:manejo-de-fechas-en-java-ii
    public static Periodo getIntervaloUltimosMesesA(int nMeses, Date fechaReferencia) {
    	Periodo interv = new Periodo();
    	
		Calendar cal = Calendar.getInstance();
		cal.setTime(fechaReferencia);
		cal.add(Calendar.MONTH, -nMeses);
		interv.setInicio(cal.getTime());
		
		cal.setTime(fechaReferencia);
		cal.add(Calendar.MONTH, -1);
		interv.setFin(cal.getTime());
		
		return interv;
    }
}
